public class ThreadDemo7 {
    private static final long count=10_0000_0000;//变量就是内存，两个线程能够访问同一个变量，这两个线程就是在使用同一个内存

    //使用串行的方式，对 a和 b进行自增
    public static void serial() {
        long begin=System.currentTimeMillis();
        //System.currentTimeMillis() 获取当前系统的毫秒级时间戳 (时间戳 以1970年1月1日凌晨开始)

        int a=0;
        int b=0;
        for (int i = 0; i <count; i++) {
            a++;
        }

        for (int i = 0; i <count; i++) {
            b++;
        }

        long end=System.currentTimeMillis();
        System.out.println("经过的时间为"+(end-begin));
    }

    //使用并发的方式，对 a和 b进行自增
    public static void conCurrency() {
        long begin=System.currentTimeMillis();

        Thread t1=new Thread() {
            @Override
            public void run() {
                int a=0;
                for (int i = 0; i <count; i++) {
                    a++;
                }
            }
        };

        t1.start();

        Thread t2=new Thread(){
            @Override
            public void run() {
                int b=0;
                for (int i = 0; i <count; i++) {
                    b++;
                }
            }
        };
        t2.start();

        //需要保证 t1和t2 都执行完之后，再结束计时
        try {
            //join() 等待对应线程结束
            //当 t1和t2 没执行完之前，join()方法就会阻塞等待，直到 t1和t2 执行完它的任务
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        long end=System.currentTimeMillis();
        System.out.println("经过的时间为 "+(end-begin));
    }


    public static void main(String[] args) {
        //serial();
        conCurrency();
        //使用并发的确比串行运行时间短，速度快
        //但是速度并不一定刚好提高一倍，因为调度线程自身会有开销
    }
}
